/*
 * Copyright (C) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.bytedance.scene.dialog.bottomsheet;

import ohos.agp.animation.Animator;
import ohos.agp.animation.AnimatorValue;

/**
 * AnimationProcessor
 *
 * @since 2021-06-16
 */
class AnimationProcessor {
    /**
     * SlidingUpBuilder
     */
    private SlidingUpBuilder mBuilder;
    /**
     * 数值动画
     */
    private ValueAnimator mValueAnimator;

    /**
     * 构造方法
     *
     * @param builder SlidingUpBuilder
     * @param updateListener 数值更新监听
     * @param listener 状态改变监听
     */
    AnimationProcessor(SlidingUpBuilder builder, AnimatorValue.ValueUpdateListener updateListener,
                       Animator.StateChangedListener listener) {
        mBuilder = builder;
        createAnimation(updateListener, listener);
    }

    /**
     * 结束动画
     */
    void endAnimation() {
        if (mValueAnimator != null && mValueAnimator.isRunning()) {
            mValueAnimator.end();
        }
    }

    /**
     * 是否运行中
     *
     * @return 是否运行
     */
    boolean isAnimationRunning() {
        return mValueAnimator != null && mValueAnimator.isRunning();
    }

    /**
     * 开启动画
     *
     * @param from 开始
     * @param to 结束
     */
    void setValuesAndStart(float from, float to) {
        mValueAnimator.setFloatValues(from, to);
        mValueAnimator.start();
    }

    /**
     * 创建动画
     *
     * @param updateListener 更新监听
     * @param listener 状态改变监听
     */
    private void createAnimation(AnimatorValue.ValueUpdateListener updateListener,
                                Animator.StateChangedListener listener) {
        mValueAnimator = ValueAnimator.ofFloat();
        mValueAnimator.setDuration(Constants.THIRTY_NUM_CONST);
        mValueAnimator.setInterpolator(mBuilder.isInterpolator);
        mValueAnimator.setValueUpdateListener(updateListener);
        mValueAnimator.setStateChangedListener(listener);
    }
}
